package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.DishDto;
import com.itheima.reggie.entity.DishFlavor;
import com.itheima.reggie.mapper.DishMapper;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author ：sean
 * @date ：Created in 2022/5/19
 * @description ：菜品业务实现类
 * @version: 1.0
 */
@Slf4j
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

	@Autowired
	private DishFlavorService dishFlavorService;

	// 当前业务方法，是不是多次操作数据了，这个时候怎么办？
	@Transactional
	@Override
	public void saveWithFlavor(DishDto dishDto) {
		log.info("[保存菜品],dto:{}",dishDto);
		// 完成菜品基本信息的保存，通过MP框架，把数据写入到表中
		// insert into  dish() values(???????)
		this.save(dishDto);
		// 保存完成后，自动返回菜品ID
		Long dishId = dishDto.getId();
		log.info("[保存菜品],dishId:{}",dishId);
		//if (true)
		//	throw new CustomException("故意的");
		// flavors:
		// dish_id = dishId
		// name = 辣度
		// value=["不辣","微辣","中辣","重辣","变态辣 "]
		// name = 温度
		// value=["不辣","微辣","中辣","重辣","变态辣 "]
		// 菜品口味的保存，需要业务对象
		//遍历口味列表，把菜品的ID，放进去
		List<DishFlavor> flavors = dishDto.getFlavors();
		//for (DishFlavor dishFlavor: flavors){
		//	dishFlavor.setDishId(dishId);
		//	//dishFlavorService.save(dishFlavor);
		//	// 保存1次，连接次
		//}
		List<DishFlavor> dishFlavorList = flavors.stream().map((item) -> {
			item.setDishId(dishId);
			return item;
		}).collect(Collectors.toList());

		log.info("[保存菜品],flavors:{}",dishFlavorList);
		// 批量保存
		dishFlavorService.saveBatch(dishFlavorList);
	}

	@Override
	public DishDto getByIdWithFlavor(Long id) {
		// 根据菜品ID，获取菜品对象
		Dish dish = this.getById(id);
		if(dish == null){
			throw new CustomException("菜品为找到！！！");
		}
		// 现在我们要的dishDto，但是我们的数据在Dish,怎么办？
		DishDto dishDto = new DishDto();
		BeanUtils.copyProperties(dish,dishDto);
		// dishDto只有菜品的基本信息，是不是没有口味列表
		// 接下来，使用菜品口味的Service,获取菜品口味列表，条件是？根据菜品的Id
		LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper();
		lambdaQueryWrapper.eq(DishFlavor::getDishId,dish.getId());
		List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
		// 获取到菜品口味列表，赋值给Dto
		dishDto.setFlavors(dishFlavorList);
		return dishDto;
	}

	// 当前业务方法，涉及多个Dao操作
	@Override
	@Transactional
	public void updateWithFlavor(DishDto dishDto) {
		// 完成菜品及菜品口味的更新
		// 思路：先更新菜品基本信息，然后再更新口味列表信息
		// 更新菜品基本信息
		this.updateById(dishDto);
		// 更新口味列表信息，这个地方如何更新？
		// 最好的做法：经验之谈
		 // 根据菜品ID，把之前的口味全部删除
		// delete from dish_flavor where dish_id = 9828 2条删除
		LambdaQueryWrapper<DishFlavor> dishFlavorLambdaQueryWrapper = new LambdaQueryWrapper<>();
		dishFlavorLambdaQueryWrapper.eq(DishFlavor::getDishId,dishDto.getId());
		dishFlavorService.remove(dishFlavorLambdaQueryWrapper);
		 // 再口味列表，重新插入

		// 遍历请求的口味列吧，把菜品的ID，赋值进去
		List<DishFlavor> flavors = dishDto.getFlavors();
		for (DishFlavor dishFlavor:flavors){
			dishFlavor.setDishId(dishDto.getId());
		}
		// dishFlavor还是原来的Id
		// 批量保存口味列表
		//insert into dish_flavor
		// values(222,"zhangsan")
		// values(333,"lisi")
		dishFlavorService.saveBatch(flavors);
	}
}
